package com.davidlife.jvm.gc.relive;

public class CanReliveObj {
    public static CanReliveObj obj;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("CanReliveObj finalize Called");
        //在finalize中可复活对象
        obj = this;  //finalize函数是实例方法，因此this也会被传入此方法。
    }

    @Override
    public String toString() {
        return "I am CanReliveObj";
    }

    public static void main(String[] args) throws InterruptedException {
        obj = new CanReliveObj();
        obj = null;
        System.gc();
        Thread.sleep(1000);
        if (obj == null) {
            System.out.println("obj 是 null");
        } else {
            System.out.println("obj 可用");
        }
        System.out.println("第2次 gc");
        obj = null;
        System.gc();
        if (obj == null) {
            System.out.println("obj 是 null");
        } else {
            System.out.println("obj 可用");
        }
    }
}

/*
一种可能的输出情况：
CanReliveObj finalize Called
obj 可用
第2次 gc
obj 是 null
 */